package cn.wzut.edut.service;

import cn.wzut.edut.dao.inf.Dept;
import cn.wzut.edut.dao.inf.Information;
import cn.wzut.edut.dao.inf.User;
import cn.wzut.edut.dao.inf.Role;
import cn.wzut.edut.dao.pojo.table.*;
import cn.wzut.edut.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class UserService {

    @Autowired
    User user;

    @Autowired
    Dept dept;

    @Autowired
    Role role;

    @Autowired
    Information information;

    @Autowired
    ClientService clientService;

    public boolean createUser(String userName, String realName, String deptId, String sex, String phone, String password, String type){
        if(type.equals("student")){
            String userId = user.insertSysUser(new SysUser(null, userName, realName, SysService.encrypt(password), deptId, "1"));
            information.insertPtyStu(new PtyStu(null, sex, null, phone, userId));
            //用户组织关系表插入
            dept.insertUserDept(userId, deptId);
            return true;
        } else if (type.equals("teacher")) {
            String userId = user.insertSysUser(new SysUser(null, userName, realName, SysService.encrypt(password), deptId, "1"));
            information.insertPtyTeacher(new PtyTeacher(null, sex, null, phone, userId));
            //用户组织关系表插入
            dept.insertUserDept(userId, deptId);
            return true;
        }
        throw new ServiceException(-1, "参数错误");
    }

    public boolean deleteUser(String[] delUserIds, boolean delFlag){
        List<String> user_id = Arrays.asList(delUserIds);
        if(delFlag){
            return user.delCascadeUserList(user_id);
        }
        else{
            return user.logicDelList(user_id, false);
        }
    }

    public boolean resetUserPassword(String userId){
        return user.updatePwd(userId, "123456");
    }

    public SysUser getUserInfoById(String userId){
        return user.selectUserInId(userId);
    }

    public boolean updateUser(String userName, String realName, String deptId, String phone, String userId){
        return user.updateSysUser(new SysUser(userId, userName, realName, null, deptId, null));
    }


    /**
     * 获取当前班级的学生列表请求
     * @param classId
     * @param current
     * @param size
     * @return
     */
    public Map<String, Object> getUserByClass(String classId, long current, long size){
        //返回字典
        Map<String, Object> data = new HashMap<>();
        data.put("sysUserList", user.selectUserListByDeptPage(classId, current, size));
        data.put("sysUserCount", dept.countSysDeptUser(null, classId, null));
        return data;
    }

    public Map<String, Object> getUserByNameAndDept(String realName, String deptId, long current, long size){
        //返回字典
        Map<String, Object> data = new HashMap<>();
        data.put("sysUserList", user.selectUserListByDeptIdAndNamePage(deptId, realName, current, size));
        data.put("sysUserCount", user.countUserListByDeptIdAndNamePage(deptId, realName));
        return data;
    }

    public Map<String, Object> getUserByType(String type, long current, long size){
        if(type.equals("student")){
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectStudentInfPage(null, null, null, null
                    , null, null, null, null, null, null, current, size));
            data.put("sysUserCount", user.countStudentInf(null, null, null, null
                    , null, null, null, null, null, null));
            return data;
        } else if (type.equals("teacher")) {
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectTeacherInfPage(null, null, null, null
                    , null, null, null, null, null, current, size));
            data.put("sysUserCount", user.countTeacherInf(null, null, null, null
                    , null, null, null, null, null));
            return data;
        }
        throw new ServiceException(-1, "参数错误");
    }

    public Map<String, Object> getUserByType(String type){
        if(type.equals("student")){
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectStudentInf(null, null, null, null
                    , null, null, null, null, null, null));
            return data;
        } else if (type.equals("teacher")) {
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectTeacherInf(null, null, null, null
                    , null, null, null, null, null));
            return data;
        }
        throw new ServiceException(-1, "参数错误");
    }

    public Map<String, Object> getUserByName(String name, String type, long current, long size){
        if(type.equals("student")){
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectStudentInfPage(null, null, name, null, null
                    , null, null, null, null, null, current, size));
            data.put("sysUserCount", user.countStudentInf(null, null, name, null, null
                    , null, null, null, null, null));
            return data;
        } else if (type.equals("teacher")) {
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectTeacherInfPage(null, null, name, null, null
                    , null, null, null, null, current, size));
            data.put("sysUserCount", user.countTeacherInf(null, null, name, null, null
                    , null, null, null, null));
            return data;
        }
        throw new ServiceException(-1, "参数错误");
    }

    //（寄）
    public Map<String, Object> getUserByDept(String deptId, String type, long current, long size){
        if(type.equals("student")){
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectStudentInfPage(null, null, null, deptId, null
                    , null, null, null, null, null, current, size));
            data.put("sysUserCount", user.countStudentInf(null, null, null, deptId, null
                    , null, null, null, null, null));
            return data;
        } else if (type.equals("teacher")) {
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectTeacherInfPage(null, null, null, deptId, null
                    , null, null, null, null, current, size));
            data.put("sysUserCount", user.countTeacherInf(null, null, null, deptId, null
                    , null, null, null, null));
            return data;
        }
        throw new ServiceException(-1, "参数错误");
    }

    public Map<String, Object> getUserByDeptAndName(String deptId, String realName, String type, long current, long size){
        if(type.equals("student")){
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectStudentInfPage(null, null, realName, deptId, null
                    , null, null, null, null, null, current, size));
            data.put("sysUserCount", user.countStudentInf(null, null, realName, deptId, null
                    , null, null, null, null, null));
            return data;
        } else if (type.equals("teacher")) {
            //返回字典
            Map<String, Object> data = new HashMap<>();
            data.put("sysUserList", user.selectTeacherInfPage(null, null, realName, deptId, null
                    , null, null, null, null, current, size));
            data.put("sysUserCount", user.countTeacherInf(null, null, realName, deptId, null
                    , null, null, null, null));
            return data;
        }
        throw new ServiceException(-1, "参数错误");
    }

    public Map<String, Object> getRoleByUser(String userId, long current, long size){
        //返回字典
        Map<String, Object> data = new HashMap<>();
        data.put("sysUserList", role.selectRoleListByUserPage(userId, current, size));
        data.put("sysUserCount", user.countSysUserRole(null, userId, null));
        return data;
    }

    public Map<String, Object> getRoleByUser(String userId){
        //返回字典
        Map<String, Object> data = new HashMap<>();
        data.put("sysUserList", role.selectRoleListByUser(userId));
        data.put("sysUserCount", user.countSysUserRole(null, userId, null));
        return data;
    }

    public boolean updateRoleByUser(String userId, String[] addRoles, String[] delRoles){
        List<String> user_id = Arrays.asList(userId);
        List<String> role_id = Arrays.asList(delRoles);
        // 删除权限
        user.delSysUserRoleList(null, user_id, role_id);
        // 新增权限
        List<SysUserRoleRel> sysUserRoleRelList = new ArrayList<>();
        for(String addRole : addRoles){
            sysUserRoleRelList.add(new SysUserRoleRel(null, userId, addRole));
        }
        user.insertSysUserRoleRelList(sysUserRoleRelList);
        return true;
    }


















//    /**
//     * 获取用户分页列表
//     * @param token
//     * @return
//     */
//    public List<SysUser> getUserListByPage(String token, long current, long size){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            //返回列表
//            return login.selectAllSysUserPage(current, size);
//        }
//        throw new ServiceException(-1, "获取用户列表失败（无权调用）");
//    }
//
//    /**
//     * 根据用户名查询用户
//     * @param token
//     * @return
//     */
//    public List<SysUser> getUserListByName(String token, String real_name, long current, long size){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            //返回列表
//            return login.selectUserInRealNamePage(real_name, current, size);
//        }
//        throw new ServiceException(-1, "获取用户列表失败（无权调用）");
//    }
//
//    /**
//     * 根据组织筛选用户
//     * @param token
//     * @return
//     */
//    public List<SysUser> getUserListByDept(String token, String college, String classname, long current, long size){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            //返回列表
//            return dept.selectUserInDeptPage(college, classname, current, size);
//        }
//        throw new ServiceException(-1, "获取用户列表失败（无权调用）");
//    }
//
//    /**
//     * 删除用户
//     * @param token
//     * @return
//     */
//    public boolean delUser(String token, String[] ids){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            //返回列表
//            for (String id : ids) {
//                if(!login.delSysUser(id)){
//                    throw new ServiceException(-1, "删除用户失败（内部错误:" + id + "）");
//                }
//            }
//            return true;
//        }
//        throw new ServiceException(-1, "获取用户列表失败（无权调用）");
//    }
//
//    /**
//     * 单个用户的获取
//     * @param token
//     * @return
//     */
//    public SysUser getUser(String token, String id){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            return login.selectUserInId(id);
//        }
//        throw new ServiceException(-1, "获取用户信息失败（无权调用）");
//    }
//
//    /**
//     * 创建用户
//     * @param token
//     * @return
//     */
//    public String addUser(String token, UserInfo userInfo){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            return login.insertSysUser(new SysUser("1", userInfo.getUserid(), userInfo.getUsername()
//                    , SysService.encrypt(userInfo.getPassword()), userInfo.getDept(), "1"));
//        }
//        throw new ServiceException(-1, "新增用户失败（无权调用）");
//    }
//
//    /**
//     * 标记删除用户
//     * @param token
//     * @return
//     */
//    public boolean modUserDelFlag(String token, String id, boolean b){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            login.logicDel(id, b);
//        }
//        throw new ServiceException(-1, "标记删除用户失败（无权调用）");
//    }
//
//    /**
//     * 重置密码
//     * @param token
//     * @return
//     */
//    public boolean resetPassword(String token, String userid){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            // 重置密码为123456
//            return login.updatePwd(userid, "123456");
//        }
//        throw new ServiceException(-1, "获取用户列表失败（无权调用）");
//    }
//
//    /**
//     * 单用户编辑
//     * @param token
//     * @return
//     */
//    public boolean editUserInf(String token, SysInformation sysInformation){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            login.updateInformation(sysInformation);
//        }
//        throw new ServiceException(-1, "更新用户信息失败（无权调用）");
//    }

//
//
//    /**
//     * 获取全部用户列表
//     * @param token
//     * @return
//     */
//    public List<UserInf> getUserList(String token){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if(decode.getClaim("end").asString().equals("B")){
//            return login.selectAllSysUserRoleName();
//        }
//        return null;
//    }
//
//
//
//    /**
//     * 获取学生列表
//     *
//     * @param token
//     * @return
//     */
//    public List<PtyStu> getStuList(String token){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if(decode.getClaim("end").asString().equals("B")){
//            return information.selectAllPtyStu();
//        }
//        return null;
//    }
//
//    /**
//     * 获取指定个数指定页的学生列表
//     *
//     * @param token
//     * @return
//     */
//    public List<PtyStu> getStuListByPage(String token, int page, int num){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if(decode.getClaim("end").asString().equals("B")){
//            //返回列表
//        }
//        return null;
//    }
//
//    /**
//     * 获取教师列表
//     *
//     * @param token
//     * @return
//     */
//    public List<PtyTeacher> getTeacherList(String token){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if(decode.getClaim("end").asString().equals("B")){
//            return information.selectAllPtyTeacher();
//        }
//        return null;
//    }
//
//    /**
//     * 获取指定个数指定页的教师列表
//     *
//     * @param token
//     * @return
//     */
//    public List<PtyTeacher> getTeacherListByPage(String token, int page, int num){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if(decode.getClaim("end").asString().equals("B")){
//            //返回列表
//        }
//        return null;
//    }
//
//    /**
//     * 添加用户
//     * @param token
//     * @return
//     */
//    public boolean addUser(String token, UserInfo userInfo){
//        try {
//            // 解析token
//            DecodedJWT decode = JWTUtils.decode(token);
//            // 判断是否是后台管理端发送的请求
//            if (decode.getClaim("end").asString().equals("B")) {
//                // 获取用户id
//                String userId = decode.getClaim("userid").asString();
//                // 判断用户是否拥有菜单9（用户管理）权限
//                if (clientService.selectRole(userId, "9")) {
//                    // 信息写入用户表
//                    //String id = login.insertSysUser(new SysUser("1", userInfo.getUid(), userInfo.getRealname(), SysService.encrypt(userInfo.getPwd())));
//                    // 信息写入用户角色关系表
//                    for (String roleId : userInfo.getRoleIds()) {
//                        //login.insertSysUserRoleRel(new SysUserRoleRel("1", id, roleId));
//                    }
//                    // 获取用户信息判断存放置学生表或教师表
//                    if (userInfo.getEnd().equals("A")) {
//                        //information.insertPtyStu(new PtyStu("1", userInfo.getCode(), userInfo.getSex(), userInfo.getRealname(), userInfo.getOpenid()
//                        //        , userInfo.getPhone(), userInfo.getClass_id(), userInfo.getCollege_id(), id));
//                    } else {
//                        //information.insertPtyTeacher(new PtyTeacher("1", userInfo.getCode(), userInfo.getRealname(), userInfo.getOpenid()
//                        //        , userInfo.getPhone(), userInfo.getCollege_id(), id));
//                    }
//                    return true;
//                }
//            }
//        }
//        catch(Exception e){}
//        return false;
//    }
//
//    /**
//     * 删除用户
//     * @param token
//     * @return
//     */
//    public boolean delUser(String token, String[] userids) {
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if (decode.getClaim("end").asString().equals("B")) {
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//            // 判断用户是否拥有菜单9（用户管理）权限
//            if(clientService.selectRole(userId, "9")) {
//                for(String userid : userids){
//                    if(!login.delSysUser(userid)){
//                        return false;
//                    }
//                }
//                return true;
//            }
//        }
//        return false;
//    }
//
//    /**
//     * 修改用户
//     * @param token
//     * @return
//     */
//    public boolean modUser(String token, UserModInfo userModInfo) {
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if (decode.getClaim("end").asString().equals("B")) {
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//            // 判断用户是否拥有菜单9（用户管理）权限
//            if(clientService.selectRole(userId, "9")) {
//                // 更新用户表信息
//                //login.updateSysUser(new SysUser(userModInfo.getUserid(), userModInfo.getUid(), userModInfo.getRealname(), SysService.encrypt(userModInfo.getPwd())));
//                // 添加用户角色关系表信息
//                if(userModInfo.getAddRole() != null) {
//                    for (String addRoleId : userModInfo.getAddRole()) {
//                        login.insertSysUserRoleRel(new SysUserRoleRel("1", userModInfo.getUserid(), addRoleId));
//                    }
//                }
//                // 删除用户角色关系表信息
//                if(userModInfo.getDelRole() != null) {
//                    for (String delRoleId : userModInfo.getDelRole()) {
//                        role.delSysUserRole(userModInfo.getUserid(), delRoleId);
//                    }
//                }
//                // 更新学生表/教师表信息
//                if(userModInfo.getEnd().equals("A")){
//                    information.updatePtyStu(new PtyStu(information.selectPtyStu(userModInfo.getUserid()).getId(), userModInfo.getCode(), userModInfo.getSex(), userModInfo.getRealname(), userModInfo.getOpenid()
//                            , userModInfo.getPhone(), userModInfo.getClass_id(), userModInfo.getCollege_id(), userModInfo.getUserid()));
//                }else{
//                    information.updatePtyTeacher(new PtyTeacher(information.selectPtyTeacher(userModInfo.getUserid()).getId(), userModInfo.getCode(), userModInfo.getRealname(), userModInfo.getOpenid()
//                            , userModInfo.getPhone(), userModInfo.getCollege_id(), userModInfo.getUserid()));
//                }
//                return true;
//            }
//        }
//        return false;
//    }
//
//    /**
//     * 根据用户id查询用户信息
//     * @param token
//     * @return
//     */
//    public UserInfo getUserById(String token, String userid) {
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if (decode.getClaim("end").asString().equals("B")) {
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//            // 判断用户是否拥有菜单9（用户管理）权限
//            if(clientService.selectRole(userId, "9")) {
//                // 获取用户表数据
//                SysUser sysUser = login.selectUserInId(userid);
//                // 获取用户角色表数据
//                List<String> strings = login.selectSysUserOnlyRole(userid);
//                String[] roleIds = strings.toArray(new String[strings.size()]);
//                String end = "B";
//                for(String roleId : roleIds){
//                    if(clientService.selectRole(userid, "3")){ // 判断是否拥有学生权限（学生表）
//                        end = "A";
//                        break;
//                    }
//                }
//                // 获取学生表/教师表数据
//                if(end.equals("A")){
//                    StuInf stuInf = information.selectPtyStu(userid);
//                    return new UserInfo("A", sysUser.getUserName(), SysService.decrypt(sysUser.getHashPassword())
//                            , sysUser.getRealName(), stuInf.getStu_code(), stuInf.getSex(), stuInf.getPhone()
//                            , stuInf.getCollege_name(), roleIds, stuInf.getOpen_id(), stuInf.getClass_name());
//                }else{
//                    TcInf tcInf = information.selectPtyTeacher(userid);
//                    return new UserInfo("B", sysUser.getUserName(), SysService.decrypt(sysUser.getHashPassword())
//                            , sysUser.getRealName(), tcInf.getTeacher_code(), null, tcInf.getPhone()
//                            , tcInf.getCollege_name(), roleIds, tcInf.getOpen_id(), null);
//                }
//            }
//        }
//        return null;
//    }

}
